#!/usr/bin/env bash
# Summary: Configure the shell environment for plenv
# Usage: eval "$(plenv init - [--no-rehash] [<shell>])"

set -e
[ -n "$PLENV_DEBUG" ] && set -x

print=""
shell=""

for arg in "$@" ; do
  case "$arg" in
  - )
    print=1
    ;;
  --no-rehash )
    ;;
  * )
    [ -z "$shell" ] && shell="$arg"
  esac
done

if [ -z "$shell" ]; then
  shell="$(ps c -p $PPID -o 'comm=' 2>/dev/null || true)"
  shell="${shell##-}"
  shell="${shell:-$SHELL}"
  shell="${shell##*/}"
fi

abs_dirname() {
  local cwd="$PWD"
  local path="$1"

  while [ -n "$path" ]; do
    cd "${path%/*}"
    local name="${path##*/}"
    path="$($READLINK "$name" || true)"
  done

  pwd
  cd "$cwd"
}

root="$(abs_dirname "$0")/.."

if [ -z "$print" ]; then
  case "$shell" in
  bash )
    profile='~/.bash_profile'
    ;;
  zsh )
    profile='~/.zshrc'
    ;;
  ksh )
    profile='~/.profile'
    ;;
  fish )
    profile='~/.config/fish/config.fish'
    ;;
  * )
    profile='your profile'
    ;;
  esac

  { echo "# Load plenv automatically by adding"
    echo "# the following to ${profile}:"
    echo
    case "$shell" in
    fish )
      echo 'status --is-interactive; and . (plenv init -|psub)'
      ;;
    * )
      echo 'eval "$(plenv init -)"'
      ;;
    esac
    echo
  } >&2

  exit 1
fi

mkdir -p "${PLENV_ROOT}/"{shims,versions}

case "$shell" in
fish )
  echo "set -gx PATH '${PLENV_ROOT}/shims' \$PATH"
  echo "set -gx PLENV_SHELL $shell"
  ;;
* )
  echo 'export PATH="'${PLENV_ROOT}'/shims:${PATH}"'
  echo "export PLENV_SHELL=$shell"
  ;;
esac

completion="$root/completions/plenv.${shell}"
case "$shell" in
bash | zsh )
  echo "source '$completion'"
  ;;
fish )
  echo ". '$completion'"
  ;;
esac

commands=(`plenv-commands --sh`)
case "$shell" in
fish )
  echo '
function plenv
  set command $argv[1]
  set -e argv[1]

  switch "$command"
  case '"${commands[*]}"'
    eval (plenv "sh-$command" $argv)
  case '\''*'\''
    command plenv "$command" $argv
  end
end'
  ;;
ksh )
  echo '
function plenv {
  typeset command'
  ;;
* )
  echo '
plenv() {
  local command'
  ;;
esac

if [ "$shell" != "fish" ]; then
IFS="|"
echo '
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  '"${commands[*]}"')
    eval "`plenv "sh-$command" "$@"`";;
  *)
    command plenv "$command" "$@";;
  esac
}'
fi
